<!DOCTYPE HTML>
<html>
<head><meta name="generator" content="Hexo 3.9.0">
  <meta charset="utf-8">
  
  <title>Servlet和JSP › 但行好事，莫问前程</title>
  <meta name="author" content="fengbo">
  
  <meta name="description" content="不想当架构师的程序员不是好厨师 ，不认为PHP是世界上最好的编程语言的Python开发者不是一个好的Javaer。">
  
  
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  <meta property="og:title" content="Servlet和JSP">
  <meta property="og:site_name" content="但行好事，莫问前程">

  
    <meta property="og:image" content="undefined">
  

  <link href="/favicon.png" rel="icon">
  <link rel="alternate" href="/atom.xml" title="但行好事，莫问前程" type="application/atom+xml">
  <link rel="stylesheet" href="/css/style.css" media="screen" type="text/css">
  <!--[if lt IE 9]><script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
  

</head>
</html>

<body>
  <header id="header"><div class="meta inner">
  <h1><a href="/">但行好事，莫问前程</a></h1>
  <h2><a href="/">CV工程师，了解面向Google编程的基本原理，有三年使用Google经验，在通往程序员的道路上艰难的爬行着。</a></h2>
  <nav id="main-nav">
    <ul>
      
      <li><a href="/">Home</a></li>
      
      <li><a href="/archives">Archives</a></li>
      
      <li><a href="/atom.xml">RSS</a></li>
      
    </ul>
    <div class="clearfix"></div>
  </nav>
</div>
<div class="clearfix"></div>
</header>
  <div id="content" class="inner">
    <div id="main-col" class="alignleft"><div id="wrapper"><article class="post">
  <div class="post-content">
    <header>
      
  
    <h1 class="title">Servlet和JSP</h1>
  

      
        <time datetime="2017-06-22T10:52:20.000Z">2017-06-22</time>
      
    </header>
    <div class="entry">
      
        <h2 id="Servlet"><a href="#Servlet" class="headerlink" title="Servlet"></a>Servlet<a id="more"></a></h2><ul>
<li>Servlet是一个供其他Java程序（Servlet引擎）调用的Java类，没有main方法，它不能独立运行，它的运行完全由容器（Servlet引擎）来控制和调度。Servlet是在第一次访问是初始化的，但是可以在web.xml配置成在服务器启动的时候初始化，即添加<load-on-startup>1</load-on-startup>配置。</li>
<li>web.xml文件中的Servlet配置的顺序是有先后的，一般我们设置好，此时请求来到会交给不同的servlet来处理。</li>
<li>Servlet是单例的。针对客户端的多次Servlet请求，通常情况下，服务器只会创建一个Servlet实例对象，也就是说Servlet实例对象一旦创建，它就会驻留在内存中，为后续的其它请求服务，直至web容器退出，servlet实例对象才会销毁。</li>
<li>在Servlet的整个生命周期内，Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次Servlet的service方法。对于每次HTTP请求，Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象，然后将这两个对象作为参数传递给它调用的Servlet的service()方法，service方法再根据请求方式分别调用doXXX方法。</li>
</ul>
<h3 id="Servlet接口，顶级接口（有5个方法，其中前三个是生命周期方法）"><a href="#Servlet接口，顶级接口（有5个方法，其中前三个是生命周期方法）" class="headerlink" title="Servlet接口，顶级接口（有5个方法，其中前三个是生命周期方法）"></a>Servlet接口，顶级接口（有5个方法，其中前三个是生命周期方法）</h3><ul>
<li>init(ServletConfig config)：在Servlet创建之后马上执行；</li>
<li>service(ServletRequest req, ServletResponse res)：每次处理请求都会调用该方法；</li>
<li>destroy()：Servlet被销毁前调用该方法。</li>
<li>getServletConfig()：获取Servlet的配置信息，返回一个ServletConfig对象。即和web.xml中的servlet配置相对应，Tomcat在解析web.xml时将web.xml中的servlet配置信息保存到一个ServletConfig对象中。<ul>
<li>getServletName()：获取Servlet的name。</li>
<li>getServletContext()：获取ServletContext对象</li>
<li>getInitParameter(String name)：根据名称或者初始化参数</li>
<li>getInitParameterNames()：获取所有的初始化参数的名称</li>
</ul>
</li>
<li>getServletInfo()：获取Servlet信息。</li>
</ul>
<h3 id="GenericServlet：实现Servlet接口的抽象类"><a href="#GenericServlet：实现Servlet接口的抽象类" class="headerlink" title="GenericServlet：实现Servlet接口的抽象类"></a>GenericServlet：实现Servlet接口的抽象类</h3><h3 id="HttpServlet：继承了GenericServlet抽象类（主要使用该类）"><a href="#HttpServlet：继承了GenericServlet抽象类（主要使用该类）" class="headerlink" title="HttpServlet：继承了GenericServlet抽象类（主要使用该类）"></a>HttpServlet：继承了GenericServlet抽象类（主要使用该类）</h3><ul>
<li>主要覆盖doGet和doPost方法，如果没有覆盖这两个方法，确请求该方法会返回405（表示不支持该访问方式）</li>
</ul>
<h3 id="ServletContext"><a href="#ServletContext" class="headerlink" title="ServletContext"></a>ServletContext</h3><ul>
<li>一个项目中只有一个ServletContext对象（application域对象）</li>
<li>在服务器启动时创建，在服务器关闭时销毁</li>
<li>获取初始化参数（Servlet也可以初始化参数，但是一个Servlet只能获取自己的初始化参数，不能获取别人的）</li>
<li>getInitParameter(String name)：得到初始化参数（和Servlet初始化参数不同，这个是根据<context-param>里面的<param-name>获取<param-value>）</param-value></param-name></context-param></li>
<li>获取资源相关方法<ul>
<li>getRealPath(“/index.jsp”)：获取真实的路径，即磁盘路径</li>
<li>getResourceAsStream(“/index.jsp”)：返回一个InputStream对象</li>
<li>getResourcePaths(“/WEB-INF”)：获取WEB-INF下所有文件夹和文件的路径</li>
</ul>
</li>
</ul>
<h3 id="Servlet三大域："><a href="#Servlet三大域：" class="headerlink" title="Servlet三大域："></a>Servlet三大域：</h3><h4 id="1-request：仅在当前请求中有效。"><a href="#1-request：仅在当前请求中有效。" class="headerlink" title="1. request：仅在当前请求中有效。"></a>1. request：仅在当前请求中有效。</h4><p>常用于服务器间同一请求不同页面之间的参数传递，常应用于表单的控件值传递。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">request.setAttribute();</span><br><span class="line">request.getAttribute();</span><br><span class="line">request.removeAttribute();</span><br><span class="line">request.getParameter();<span class="comment">//接受从表单传递过来的数据</span></span><br></pre></td></tr></table></figure></p>
<h4 id="2-session：服务器会为每个会话创建一个session对象"><a href="#2-session：服务器会为每个会话创建一个session对象" class="headerlink" title="2. session：服务器会为每个会话创建一个session对象"></a>2. session：服务器会为每个会话创建一个session对象</h4><p>用户打开浏览器会话开始，直到关闭浏览器会话才会结束。一次会话期间只会创建一个session对象。<br>备注： session是服务器端对象，保存在服务器端。并且服务器可以将创建session后产生的sessionid通过一个cookie返回给客户端，以便下次验证。（session底层依赖于cookie）<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">HttpSession session = request.getSession();</span><br><span class="line"><span class="comment">//&lt;%session.serAttribute(“name”,”admin”)%&gt;</span></span><br><span class="line">session.setAttribute();</span><br><span class="line">session.getAttribute();</span><br><span class="line">session.removeAttribute();</span><br></pre></td></tr></table></figure></p>
<h4 id="3-Application（ServletContext）-所有的用户都可以取得此信息，此信息在整个服务器上被保留。"><a href="#3-Application（ServletContext）-所有的用户都可以取得此信息，此信息在整个服务器上被保留。" class="headerlink" title="3. Application（ServletContext）:所有的用户都可以取得此信息，此信息在整个服务器上被保留。"></a>3. Application（ServletContext）:所有的用户都可以取得此信息，此信息在整个服务器上被保留。</h4><p>ServletContext在服务器启动时创建，在服务器关闭时销毁，一个JavaWeb应用只创建一个ServletContext对象。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ServletContext app = <span class="keyword">this</span>.getServletContext();</span><br><span class="line">app.setAttribute(“name”, “kaixuan”);    <span class="comment">//设置一个值进去</span></span><br><span class="line">app.getAttribute(“name”);    <span class="comment">//获取键值对</span></span><br></pre></td></tr></table></figure></p>
<h3 id="Servlet之间的跳转："><a href="#Servlet之间的跳转：" class="headerlink" title="Servlet之间的跳转："></a>Servlet之间的跳转：</h3><h4 id="1-转发-Forward"><a href="#1-转发-Forward" class="headerlink" title="1. 转发(Forward):"></a>1. 转发(Forward):</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">RequestDispatcher d = request.getRequestDispatcher(<span class="string">"forward.jsp"</span>);    </span><br><span class="line">d.forward(request, response);</span><br></pre></td></tr></table></figure>
<p>在MVC模式中，都是用Servlet来处理用户请求，把结果通过request.setAttribute()放到request中，然后forward到JSP中显示。在forward之前尽量不要使用out.println()。当使用forward跳转时，地址栏不会发生改变。</p>
<h4 id="2-重定向-Redirect-："><a href="#2-重定向-Redirect-：" class="headerlink" title="2. 重定向(Redirect)："></a>2. 重定向(Redirect)：</h4><p>重定向是利用服务器返回的状态码来实现的。客户端请求服务器是，服务器会返回一个状态码。服务器端通过HttpServletResponse的setStatus(int statuss)方法设置状态码。<br>自动刷新(Refresh)：<br>自动刷新不断可以实现一段时间调转到其他页面，还可以实现一段时间自动刷新。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">response.setHeader(<span class="string">"Refresh"</span>,<span class="string">"1000; URL=http://localhost:8080/example.html"</span>);</span><br><span class="line">response.setRefresh(<span class="string">"http://localhost:8080/example.html"</span>);</span><br></pre></td></tr></table></figure></p>
<h2 id="JSP"><a href="#JSP" class="headerlink" title="JSP"></a>JSP</h2><h4 id="Jsp多一个域（pageContext）它的有效范围只在当前jsp页面。"><a href="#Jsp多一个域（pageContext）它的有效范围只在当前jsp页面。" class="headerlink" title="Jsp多一个域（pageContext）它的有效范围只在当前jsp页面。"></a>Jsp多一个域（pageContext）它的有效范围只在当前jsp页面。</h4><h4 id="WEB开发中实现会话跟踪：session、cookie、地址重写和隐藏域"><a href="#WEB开发中实现会话跟踪：session、cookie、地址重写和隐藏域" class="headerlink" title="WEB开发中实现会话跟踪：session、cookie、地址重写和隐藏域"></a>WEB开发中实现会话跟踪：session、cookie、地址重写和隐藏域</h4><h4 id="Jsp原理：当服务器上的一个jsp页面第一次被请求执行时，服务器上的jsp引擎将这个jsp页面转译成一个Servlet文件，再将这个java文件编译生成字节码文件。然后通过字节码文件响应用户请求。"><a href="#Jsp原理：当服务器上的一个jsp页面第一次被请求执行时，服务器上的jsp引擎将这个jsp页面转译成一个Servlet文件，再将这个java文件编译生成字节码文件。然后通过字节码文件响应用户请求。" class="headerlink" title="Jsp原理：当服务器上的一个jsp页面第一次被请求执行时，服务器上的jsp引擎将这个jsp页面转译成一个Servlet文件，再将这个java文件编译生成字节码文件。然后通过字节码文件响应用户请求。"></a>Jsp原理：当服务器上的一个jsp页面第一次被请求执行时，服务器上的jsp引擎将这个jsp页面转译成一个Servlet文件，再将这个java文件编译生成字节码文件。然后通过字节码文件响应用户请求。</h4><h3 id="JSP九大内置对象分为四类"><a href="#JSP九大内置对象分为四类" class="headerlink" title="JSP九大内置对象分为四类"></a>JSP九大内置对象分为四类</h3><ul>
<li><p>输入输出对象：out对象、response对象、request对象</p>
<ul>
<li>out对象：用于页面输出，javax.servlet.jsp.JspWriter</li>
<li>request对象：得到用户请求，javax.servlet.http.HttpServletRequest</li>
<li>response对象：服务器向客户端的回应信息，javax.servlet.http.HttpServletResponse</li>
</ul>
</li>
<li><p>通信控制对象：pageContext对象、session对象、application对象</p>
<ul>
<li>pageContext对象：pageContext域，JSP的页面容器，javax.servlet.jsp.PageContext</li>
<li>session对象：保存用户信息，javax.servlet.http.HttpSession</li>
<li>application对象：保存所有用户共有信息，javax.servlet.ServletContext</li>
</ul>
</li>
<li><p>Servlet对象：page对象、config对象</p>
<ul>
<li>page对象：当前页面转换后的Servlet类的实例</li>
<li>config对象：获取初始化参数，javax.servlet.ServletConfig</li>
</ul>
</li>
<li><p>错误处理对象：exception对象</p>
</li>
</ul>
<h4 id="out和response区别：JspWriter对象不是直接将数据输出到页面，而是将数据先刷新到response的缓冲区，然后等待out内置对象满足一定的条件后才会调用PrintWriter对象的print系列方法把out内置对象的缓冲区中的内容输出到浏览器。"><a href="#out和response区别：JspWriter对象不是直接将数据输出到页面，而是将数据先刷新到response的缓冲区，然后等待out内置对象满足一定的条件后才会调用PrintWriter对象的print系列方法把out内置对象的缓冲区中的内容输出到浏览器。" class="headerlink" title="out和response区别：JspWriter对象不是直接将数据输出到页面，而是将数据先刷新到response的缓冲区，然后等待out内置对象满足一定的条件后才会调用PrintWriter对象的print系列方法把out内置对象的缓冲区中的内容输出到浏览器。"></a><b>out和response区别</b>：JspWriter对象不是直接将数据输出到页面，而是将数据先刷新到response的缓冲区，然后等待out内置对象满足一定的条件后才会调用PrintWriter对象的print系列方法把out内置对象的缓冲区中的内容输出到浏览器。</h4><h3 id="out内置对象调用PrintWriter对象的print系列方法输出缓冲区中内容的条件"><a href="#out内置对象调用PrintWriter对象的print系列方法输出缓冲区中内容的条件" class="headerlink" title="out内置对象调用PrintWriter对象的print系列方法输出缓冲区中内容的条件"></a>out内置对象调用PrintWriter对象的print系列方法输出缓冲区中内容的条件</h3><ul>
<li>设置page指令的buffer属性关闭了out对象的缓存功能。</li>
<li>写入到out对象中的内容充满了out对象的缓冲区。</li>
<li>整个JSP页面结束。</li>
</ul>
<h3 id="EL表达式和JSTL"><a href="#EL表达式和JSTL" class="headerlink" title="EL表达式和JSTL"></a>EL表达式和JSTL</h3><ul>
<li>EL表达式主要用来查找作用域中的数据，并对其执行简单的操作。 用美元符号$定界，内容包含在花括号{}中。例：${requestScope.name}</li>
<li>JSTL（c标签）</li>
</ul>
<h3 id="jsp语法"><a href="#jsp语法" class="headerlink" title="jsp语法"></a>jsp语法</h3><ul>
<li><p>&lt;%! %&gt;之间声明变量和方法。这些变量和方法在整个JSP页面都有效。jsp引擎在将jsp页面转译成java文件时，将这些变量作为类的成员变量、方法。</p>
</li>
<li><p>&lt;% %&gt;之间插入java程序片，程序片中的变量被称为jsp页面的局部变量。因为生成java文件是，将各个程序片的这些变量作为类中某个方法的变量。</p>
</li>
<li><p>&lt;%= %&gt;之间插入一个表达式，不可以插入语句。</p>
</li>
<li><p>&lt;%@ page %&gt;定义整个jsp页面的一些属性和这些属性的值。<br>例：&lt;% page contentType=”text/html;charest=UTF-8” pageEncoding=”UTF-8”/<em>页面编码</em>/ import=”java.util.*” %&gt;</p>
</li>
<li><p>&lt;%@ include  file=”文件的名字” %&gt;静态包含，在jsp页面整体嵌入一个文件，在编译阶段执行。</p>
</li>
<li><p>&lt;jsp:include page=”文件的名字” /&gt; 动态包含，在请求处理阶段执行。</p>
</li>
<li><p>&lt;%@ taglib uri=”c” prefix=”<a href="http://java.sun.com/jsp/jstl/core&quot;" target="_blank" rel="noopener">http://java.sun.com/jsp/jstl/core&quot;</a> %&gt;Uri用来指定标签库的存放位置，prefix用来指定标签库所使用的前缀。</p>
</li>
</ul>

      
    </div>
      
      <footer>
        
        
  
  <div class="tags">
    <a href="/tags/JavaWeb/">JavaWeb</a>
  </div>

        
  <div class="addthis addthis_toolbox addthis_default_style">
    
      <a class="addthis_button_facebook_like" fb:like:layout="button_count"></a>
    
    
      <a class="addthis_button_tweet"></a>
    
    
      <a class="addthis_button_google_plusone" g:plusone:size="medium"></a>
    
    
      <a class="addthis_button_pinterest_pinit" pi:pinit:layout="horizontal"></a>
    
    <a class="addthis_counter addthis_pill_style"></a>
  </div>
  <script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js"></script>

      
      <div class="clearfix"></div>
      </footer>
  </div>
</article>

<!-- 来必力City版安装代码 -->
<!-- <div id="lv-container" data-id="city" data-uid="MTAyMC8yOTQ5MS82MDU5">
<script type="text/javascript">
   (function(d, s) {
       var j, e = d.getElementsByTagName(s)[0];

       if (typeof LivereTower === 'function') { return; }

       j = d.createElement(s);
       j.src = 'https://cdn-city.livere.com/js/embed.dist.js';
       j.async = true;

       e.parentNode.insertBefore(j, e);
   })(document, 'script');
</script>
<noscript>为正常使用来必力评论功能请激活JavaScript</noscript>
</div> -->
<!-- City版安装代码已完成 -->

</div></div>
    <aside id="sidebar" class="alignright">
  
<div class="widget tagcloud">
  <h3 class="title">文章分类</h3>
  <div class="entry">
    <a href="/tags/JavaWeb/" style="font-size: 17.14px;">JavaWeb</a> <a href="/tags/Java基础/" style="font-size: 15.71px;">Java基础</a> <a href="/tags/Java高级特性/" style="font-size: 15.71px;">Java高级特性</a> <a href="/tags/Python/" style="font-size: 10px;">Python</a> <a href="/tags/Spring基础/" style="font-size: 14.29px;">Spring基础</a> <a href="/tags/WebRTC/" style="font-size: 10px;">WebRTC</a> <a href="/tags/其它/" style="font-size: 20px;">其它</a> <a href="/tags/分布式/" style="font-size: 11.43px;">分布式</a> <a href="/tags/硬件/" style="font-size: 12.86px;">硬件</a> <a href="/tags/计算机基础/" style="font-size: 18.57px;">计算机基础</a> <a href="/tags/设计模式/" style="font-size: 17.14px;">设计模式</a>
  </div>
</div>



    <div class="widget tagcloud">
    <h3 class="title">电子书</h3>
    <ul class="entry">
      <li class='link'><a href='http://www.duokan.com/' target="_blank">多看阅读</a>&nbsp;&nbsp;<a href='https://read.douban.com/' target="_blank">豆瓣阅读</a>&nbsp;&nbsp;<a href='http://e.dangdang.com/' target="_blank">当当阅读</a></li>
      <li class='link'><a href='http://www.ituring.com.cn/' target="_blank">图灵社区</a>&nbsp;&nbsp;<a href='https://www.epubit.com/' target="_blank">异步社区</a>&nbsp;&nbsp;<a href='https://www.geekbang.org/' target="_blank">极客空间</a></li>
    </ul>
  </div>


  
  <div class="widget tag">
    <h3 class="title">友情链接</h3>
      <ul class="entry">
        
          <li class='link'><a href='http://www.cnblogs.com/jietang/' target="_blank">唐洁的博客</a></li>
        
          <li class='link'><a href='http://rednaxelafx.iteye.com/' target="_blank">R大的博客</a></li>
        
          <li class='link'><a href='http://www.hollischuang.com/' target="_blank">阿里大神的博客</a></li>
        
          <li class='link'><a href='http://blog.csdn.net/IT_faquir/' target="_blank">IT_faquir的专栏</a></li>
        
      </ul>
  </div>


  
  <div class="widget tag">
    <h3 class="title">思维导图</h3>
      <ul class="entry">
        
          <li class='link'><a href='https://fengbo4213.github.io/img/开源协议.png' target="_blank">开源协议简介</a></li>
        
          <li class='link'><a href='https://www.processon.com/diagraming/5b0cf757e4b009aef58d4b9d' target="_blank">我的知识体系</a></li>
        
          <li class='link'><a href='https://www.processon.com/view/link/5a2a00e5e4b015e677290b4f' target="_blank">简单的网站架构</a></li>
        
      </ul>
  </div>


  
  <div class="widget tag">
    <h3 class="title">在线手册</h3>
      <ul class="entry">
        
          <li class='link'><a href='http://v3.bootcss.com/' target="_blank">BootStrap官方手册</a></li>
        
          <li class='link'><a href='http://www.iconfont.cn/http://element.eleme.io/#/zh-CN/' target="_blank">阿里巴巴矢量图标库</a></li>
        
      </ul>
  </div>


  
<div class="widget tag">
  <h3 class="title">最新文章</h3>
  <ul class="entry">
    
      <li>
        <a href="/2123/08/30/基础之MySQL原理/">MySQL原理</a>
      </li>
    
      <li>
        <a href="/2024/01/01/其它之ClickHouse索引/">ClickHouse索引</a>
      </li>
    
      <li>
        <a href="/2023/12/17/其它之MySQL线程池/">MySQL线程池</a>
      </li>
    
      <li>
        <a href="/2023/12/16/其它之InnoDB性能优化基础/">InnoDB性能优化基础</a>
      </li>
    
      <li>
        <a href="/2023/12/03/其它之Java8之后的版本新特性/">Java8之后的版本新特性</a>
      </li>
    
  </ul>
</div>

</aside>
    <div class="clearfix"></div>
  </div>
  <footer id="footer" class="inner"><div class="alignleft">
  
  &copy; 2024 fengbo
  
</div>
<div class="clearfix"></div></footer>
  <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>



</body>
</html>

